/*
 * podlewanie.h
 *
 * Created: 2012-10-04 18:59:54
 *  Author: ur
 */ 
#include <stdint.h>

#ifndef PODLEWANIE_H_
#define PODLEWANIE_H_

enum e_program_nawadniania {A,B,C};
enum e_dni_tygodnia {PON,WTO,SRO,CZW,PIO,SOB,NIE};	
	
//opis stanow dla automatu glownego
enum e_funkcje_glowne {RUN,STOP,AWARIA,MENU,PAUZA};
//opis stanow dla automatu w trybie run rodzaj pracy	
enum e_funkcje_dla_run {R_praca_reczna_wszytkie_stacje,R_praca_reczna_poj_stacja,R_praca_automatyczna};
//opis stanow dla automatu praca reczna pojedyncza sekcja	
enum e_pra_recz_poj_stac {poj_Start,poj_Odlicz,poj_Stop};
//opis stanow dla automatu praca reczna wszystkie sekcje	
enum e_funkcje_dla_praca_reczna_wszt_stac {wszt_Nastepna_sekcja,wszt_Start,wszt_Odlicz,wszt_Przerwa,wszt_Stop};
//opis stanow dla wybranego trybu automatycznego
enum e_tryb_pracy_automatycznej {dni_tygodnia, dni_parzyste, dni_nieparzyste, praca_cykliczna};
//opis stanow w trybie pracy automatycznej -dni tygodnia
enum e_tryb_automatyczny_dni_tygodnia {automat_stop,automat_oblicz,automat_start,automat_nastepna_sekcja,automat_przerwa,automat_praca};	
// zmienne dla trybu pauzy
enum e_tryb_pauzy {pauza_init,pauza_on,pauza_off,pauza_exit};


enum tryb_budzika {budzik_stop,budzik_start}	;	
	
	
	
typedef struct  
{	uint8_t godzina;
	uint8_t minuty;
	
	
}t_Czas;


// typedef struct
// 		{
// 			uint8_t dni_nawadniania;
// 			uint8_t dni_bez_nawadniania;
// 			uint8_t rodzaj_cyklu_nawadniania;
// 			}t_dni_nawadniania;


typedef struct 
	
	
	{	t_Czas czas_startowy_programu[4];
		uint8_t czas_pracy_stacji[8];
		uint8_t wybrana_sekcja;				//sekcja jaka ma sie zalonczyc podczas podlewania
		uint8_t dni_nawadniania;
		uint8_t dni_pracy_cyklicznej;
		uint8_t dni_bez_nawadniania;
		uint8_t rodzaj_cyklu_nawadniania;
	
	}t_Program_nawadniania;


typedef struct  
{	t_Program_nawadniania program_nawadniania[3];
	uint8_t aktuany_program_nawadniania;
	uint8_t wybrane_zawory_w_sekcji[8];				//ktore zawory sa zalonczane podczas podlewania
	uint8_t ilosc_dni_bez_nawadniania;
	uint8_t sezonowa_regulacja;
	uint8_t reczne_nawadnianie_pojedynczej_stacji;
	uint8_t	czas_recznego_nawadniania_pojedynczej_stacji;
	uint8_t reczne_nawadnianie_wszystkich_stacji;
	uint8_t	czas_recznego_nawadniania_wszystkich_stacji[8];  
	uint8_t  programowe_opoznienie_pomiedzy_stacjami;
	uint8_t reset_sterownika;
	
		
}t_ustawienia_nawadniania;


typedef struct {
	 uint8_t init;
	 uint8_t stan_funkcja_glowna;
	 uint8_t stan_run;
	 uint8_t stan_stop;
	 uint8_t stan_awaria;
	 uint8_t stan_menu;
	 uint8_t stan_poj_stacja;
	 uint8_t stan_praca_recz_wszy_stacje;
	 uint8_t stan_praca_automatyczna;
	 uint8_t stan_pauzy;
// 	 uint8_t stan_praca_automatyczna_dni_tygodnia;
// 	 uint8_t stan_praca_automatyczna_dni_nieparzyste;
// 	 uint8_t stan_praca_automatyczna_dni_parzyste;
// 	 uint8_t stan_praca_automatyczna_praca_cykliczna;
	
	
	}t_stany_automatu;

/////////////////////////////////////////////////////////////////
//funkcja glowna automatu
//////////////////////////////////////////////////////////////////

void funkcja_glowna(void);




//////////////////////////////////////////////////////////////////
// automaty dla trybu run
////////////////////////////////////////////////////////////////
void run (void);



//////////////////////////////////////////////////////////////////////////
// automat dla trybu stop
//////	
 void stop(void);
 
 
 //////////////////////////////////////////////////////////////////////////
 // automat dla trybu awaria
 //////////////////////////////////////////////////////////////////////////
 void awaria(void);


 //////////////////////////////////////////////////////////////////////////
 // automat dla trybu menu
 //////////////////////////////////////////////////////////////////////////
 void f_menu(void);


//////////////////////////////////////////////////////////////////////////
// funkcja w trybie Run
//////////////////////////////////////////////////////////////////////////

void run_praca_reczna_poj_stacja (void)	;


void run_praca_reczna_wszt_stacje(void);


void run_praca_automatyczna (void)	;



///////////////////////////////////////////////////////////////////////////
//funkcje dla automatu pojedyczna sekcja
///////////////////////////////////////////////////////////////////////////	
		
	
	void praca_reczna_poj_stacja_stop (void);


	void praca_reczna_poj_stacja_start (void);
	

	void praca_reczna_poj_stacja_odlicz (void);
	
	
///////////////////////////////////////////////////////////////////////////
//funkcje dla automatu praca reczna wszystkie  sekcje
///////////////////////////////////////////////////////////////////////////


void praca_reczna_wszt_stacje_stop (void);


void praca_reczna_wszt_stacje_start (uint8_t);


void praca_reczna_wszt_stacje_odlicz (void);	


void praca_reczna_wszt_stacje_przerwa(uint8_t *);


void praca_reczna_wszt_stacje_nastpena_sekcja(uint8_t *);


//////////////////////////////////////////////////////////////////////////
//funkcje dla automatu praca automatyczna
//////////////////////////////////////////////////////////////////////////
void praca_automatyczna(void) ;

void praca_automatyczna_dni_tygodnia(void) ;

void praca_automatyczna_dni_nieparzyste(void) ;

void praca_automatyczna_dni_parzyste(void) ;

void praca_automatyczna_praca_cykliczna(void);


//////////////////////////////////////////////////////////
//stan automatu pauza
///////////////////////////////////////////////////////


void f_pauza (void);


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Funkcja sluzoaca do zmiany stanu automatu jako argument przyjmuje stan oraz adres stanu ktory nalezy zmienic
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




//void zmien_stan (uint8_t stan, uint8_t * stan_automatu)	;

//funkcja ustawiajaca timer, argumentem jest wskaznik na timer, oraz dane do zaladowania

void ustaw_timer(volatile uint16_t*, uint16_t);

/////////////////////////////////////////////////////////////////////////
// funkcja obliczajaca czy ma wystartowac podlewanie
/////////////////////////////////////////////////////////////////////////

uint8_t budzik(void);



///////////////////////////////////////////////////////////
//funkcja zatrzymujaca prace pomop oraz zaworow
///////////////////////////////////////////////////////////

void praca_stop (void);


///////////////////////////////////////////////////////////
//funkcja uruchamiajaca podlewanie
///////////////////////////////////////////////////////////
void praca_start(uint8_t);


//funkcja rejestrujaca automat
 
uint8_t register_state_machine (t_stany_automatu *);

//funkcja zwracajaca wskaznik na zarejestrowany automat

t_stany_automatu * return_wsk_state_machine(void);


////////////////////////////////////////////////////////
extern t_ustawienia_nawadniania tmp_ustawienia_nawadniania;
extern t_ustawienia_nawadniania ee_ustawienia_nawadniania;

////////////////////////////////////////////
//funkcja inicjalizujaca bufora mocy oraz automat
/////////////////////////////////////////////
void init_podlewanie(void);
void inkrement_timer(void);

//////////////////////////////////////////////////
//funkcja zwracajaca aktualny czas timera
////////////////////////////////////////////////

uint16_t get_timer_praca_reczna(void);
uint16_t	get_timer_praca_automatyczna(void);
uint8_t   get_aktualna_sekcja(void);
uint8_t get_aktualna_sekcja_praca_reczna(void);

#endif /* PODLEWANIE_H_ */